package org.moonlight.push.server.xiaomi.req;

import com.xiaomi.xmpush.server.Message;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.commons.lang3.StringUtils;
import org.moonlight.push.server.BaseMessage;

import java.util.Map;

/**
 * 小米开发文档 - https://dev.mi.com/console/doc/detail?pId=2775
 *              https://dev.mi.com/console/doc/detail?pId=1278#_2_1
 * @author Moonligh
 * @date 2022-10-31 9:57
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class XiaomiMessage extends BaseMessage {
    /** 设置消息是否通过透传的方式至App, 1表示透传消息, 0表示通知栏消息(默认是通知栏消息) **/
    private int passThrough = 0;
    /** 消息内容 - 不允许全是空白字符, 长度小于4KB, 一个中英文字符均计算为1(透传消息回传给APP, 为必填字段, 非透传消息可选) **/
    private String payload;
    /** 可选项。默认情况下，通知栏只显示一条推送消息。如果通知栏要显示多条推送消息，
     * 需要针对不同的消息设置不同的notify_id（相同notify_id的通知栏消息会覆盖之前的），
     * 且要求notify_id为取值在0~2147483647的整数。 **/
    private int notifyId;
    /**
     * 通知类型, 支持以下值:
     *    1：使用默认提示音提示
     *    2：使用默认震动提示
     *    4：使用默认led灯光提示
     *    -1（系统默认值）：以上三种效果都有
     *    0：以上三种效果都无，即静默推送。
     * 并且支持1，2，4的任意OR运算来实现声音、震动和闪光灯的任意组合。
     **/
    private int notifyType = 1;
    /** 设置app的包名packageName, packageName必须和开发者网站上申请的结果一致 **/
    private String restrictedPackageName;
    /**
     * 设置app的多包名packageNames(多包名发送广播消息),
     * packageNames必须和开发者网站上申请的结果一致, 可以为空,
     * 为空则默认给所有渠道包名推送(不能同时调用restrictedPackageName方法和restrictedPackageNames方法) **/
    private String[] restrictedPackageNames;
    /** 可选项, 消息的生命周期, 若用户离线, 设置消息在服务器保存的时间, 单位: ms(服务器默认最长10天) **/
    private int timeToLive;
    /** 可选项, 定时发送消息, timeToSend是以毫秒为单位的时间戳(仅支持七天内的定时消息) **/
    private int timeToSend;
    /** 可选项, 控制消息是否需要进行平滑推送(https://dev.mi.com/console/doc/detail?pId=1278#_3_8)（qps less 3000/second）, 默认不支持 **/
    private boolean enableFlowControl;
    /** 可选项, 对app提供一些扩展功能（除了这些扩展功能, 开发者还可以定义一些key和value来控制客户端的行为,
     * 注：key和value的字符数不能超过1024, 至多可以设置10个key-value键值对） **/
    private Map<String, String> extra;

    public Message buildXiaoMiMsg(String appPkgName) {
        if (StringUtils.isBlank(restrictedPackageName)
                || StringUtils.isBlank(alertTitle)
                || StringUtils.isBlank(alertContent)) {
            throw new RuntimeException("缺少必要的参数");
        }

        alertTitle = alertTitle.trim();
        alertContent = alertContent.trim();
        payload = payload.trim();

        // 设置在通知栏展示的通知的标题, 不允许全是空白字符, 长度小于50, 一个中英文字符均计算为1(通知栏消息必填)
        if (alertTitle.length() > 50) {
            alertTitle = alertTitle.substring(0, 50);
        }
        // 	设置在通知栏展示的通知描述, 不允许全是空白字符, 长度小于128, 一个中英文字符均计算为1(通知栏消息必填)
        if (alertContent.length() > 128) {
            alertContent = alertContent.substring(0, 128);
        }
        if (payload.length() > 4000) {
            throw new RuntimeException("参数[payload]过长（超过4000）字符！");
        }

        Message.Builder builder = new Message.Builder()
                .title(alertTitle)
                .description(alertContent)
                .payload(payload)
                .restrictedPackageName(appPkgName)
                .notifyId(notifyId)
                .passThrough(passThrough)
                .notifyType(notifyType)
                .timeToLive(timeToLive)
                .timeToSend(timeToSend);

        if (extra != null && extra.size() > 0) {
            for (String k : extra.keySet()) {
                builder.extra(k, extra.get(k));
            }
        }

        return builder.build();
    }

}